package cn.hinglo.gameclaw.admin.service;

import cn.hinglo.gameclaw.admin.dao.MoneyDao;
import cn.hinglo.gameclaw.data.entity.Result;
import cn.hinglo.gameclaw.data.utils.CommonUtils;
import cn.hinglo.gameclaw.data.utils.FileImageUtils;
import cn.hinglo.gameclaw.data.utils.IdUtils;
import cn.hinglo.gameclaw.data.utils.ResultUtils;
import cn.hinglo.gameclaw.user.bean.Money;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.StrUtil;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import java.util.*;

import static cn.hinglo.gameclaw.data.utils.CheckDataUtils.checkIdResultUtils;
import static cn.hinglo.gameclaw.data.utils.FieldUtils.*;


/**
 * @createTime: 2018/1/4
 * @author: HingLo
 * @description: 金钱管理的服务层接口
 */
@Service
public class MoneyService {

    /**
     * 定义充值活动时间不能小于多少
     */
    private final static Long ACTIVE_DATE = 1000 * 60 * 60 * 24L;
    private final MoneyDao moneyDao;

    @Autowired
    public MoneyService(MoneyDao moneyDao) {
        this.moneyDao = moneyDao;
    }

    /**
     * 系统管理员查询全部的充值类型服务
     *
     * @return 充值类型的全部集合
     */
    public Result listMoneyService() {
        return ResultUtils.success(moneyDao.selectAll());
    }

    /**
     * 通过Id来查询有效的的充值订单信息
     *
     * @param id 充值的Id
     * @return 返回订单的信息
     */
    public Money findByIdMoneyService(String id) {
        Money money = moneyDao.selectByPrimaryKey(id);
        if (money.getType() == MONEY_2) {
            long date = System.currentTimeMillis();
            boolean dateBool = (date > money.getStartDate().getTime() && date < money.getEndDate().getTime());
            return dateBool ? money : null;
        }
        return money;
    }


    /**
     * 客户端的充值列表，需要去除重复的选项
     *
     * @return 充值列表
     */
    public Result lisClientMoneyService() {
        Money m = new Money().setStatus(true);
        List<Money> moneyList = moneyDao.select(m);

        // 存放活动的集合
        List<Money> list = new ArrayList<>();
        //存放非活动的集合
        List<Money> list1 = new ArrayList<>();

        Long date = System.currentTimeMillis();

        //取出全部活动时间内的选项
        for (Money money : moneyList) {
            //判断是否是活动类型
            boolean type = money.getType() == MONEY_2;
            //检测是否在活动时间以内
            if (type) {
                boolean dateBool = (date > money.getStartDate().getTime() && date < money.getEndDate().getTime());
                if (dateBool) {
                    list.add(money);
                }
            } else {
                list1.add(money);
            }
        }

        //去掉普通与活动重复的
        for (Money money : list) {
            for (Money x : list1) {
                if (money.getNum().equals(x.getNum())) {
                    list1.remove(x);
                    break;
                }
            }
        }

        //将普通的添加到活动后面
        list.addAll(list1);
        //客户端的需求处理
        List<Map<String, Object>> mapList = getMoney(list);

        return ResultUtils.success(mapList);
    }

    private List<Map<String, Object>> getMoney(List<Money> list) {
        List<Map<String, Object>> mapList = new ArrayList<>(list.size());
        //处理传输层
        for (Money x : list) {
            Map<String, Object> map = new HashMap<>(5);
            map.put("id", x.getId());
            map.put("img", CommonUtils.imgInstall(x.getBackground(), IMAGE_5));
            map.put("num", x.getNum());
            map.put("gold", x.getGold());
            map.put("giveGold", x.getGiveGold());
            map.put("type", x.getType() == 1);
            mapList.add(map);
        }
        return mapList;
    }


    /**
     * 添加充值类型服务
     *
     * @param money      充值对象
     * @param background 背景图片
     * @return 添加结果
     */
    public Result addMoneyService(Money money, String eDate, String sDate, MultipartFile background) {
        //设置ID
        int type = money.getType();


        if (type == MONEY_2 || type == MONEY_1) {
            //活动充值
            if (type == MONEY_2) {
                String date1 = eDate.replace(",", "");
                String date2 = sDate.replace(",", "");

                if (StrUtil.isBlank(date1) || StrUtil.isBlank(date2)) {
                    return ResultUtils.error("活动时间不正确");
                }
                money.setEndDate(DateUtil.parse(date1));
                money.setStartDate(DateUtil.parse(date2));
                //开始时间
                Date sdate = money.getStartDate();
                //结束时间
                Date edate = money.getEndDate();
                //检测活动是时间是否小于最小的活动开启时间
                if (edate.getTime() - sdate.getTime() < ACTIVE_DATE) {
                    return ResultUtils.error("活动时间不正确");
                }
            }

            if (money.getGiveGold() < 0 || money.getGiveGold() > money.getNum() || money.getGold() < money.getNum()) {
                throw new RuntimeException("请仔细填写参数");
            }


            //生成文件的名称
            String fileName = FileImageUtils.createFileNameUtils(background);
            //设置Id
            money.setId(IdUtils.getId());
            //设置时间
            money.setDate(new Date());

            //设置背景图片名称
            money.setBackground(fileName);
            //保存背景图片
            if (FileImageUtils.saveImageUtils(background, fileName, IMAGE_5)) {
                if (moneyDao.insert(money) > 0) {
                    return ResultUtils.success();
                } else {
                    //插入是失败后，就删除上传好的文件
                    FileImageUtils.deleteImageUtils(fileName, IMAGE_5);
                    return ResultUtils.error("添加失败");
                }
            }
            return ResultUtils.error("图片上传成功,服务器处理失败");
        }
        return ResultUtils.error("添加的充值类型不正确");


    }


    /**
     * 根据ID 删除某个充值选项
     *
     * @param id 充值的唯一ID
     * @return 操作结果
     */
    public Result deleteMoneyService(String id) {
        checkIdResultUtils(id);

        //通过Id 来查询该充值类型的信息
        Money money = moneyDao.selectByPrimaryKey(id);

        if (money.getStatus()) {
            if (money.getType() == MONEY_2) {
                // 如果活动结束时间大于当前时间，则表示活动没有结束，不能删除活动
                if (money.getEndDate().getTime() > System.currentTimeMillis()) {
                    return ResultUtils.error("活动没有结束，不能删除");
                }
            } else {
                return ResultUtils.error("该充值正常使用中，不能执行删除操作");
            }
        }
        return moneyDao.deleteByPrimaryKey(id) > 0 ? ResultUtils.success() : ResultUtils.error("删除失败");
    }

    /**
     * 更新金额的到账金币数目
     *
     * @param id   充值的唯一ID
     * @param gold 到账的金额
     * @return 修改结果
     */
    public Result updateMoneyService(String id, Integer gold, Integer giveGold) {
        // 查询当前Id对应的金钱
        int num = moneyDao.selectByPrimaryKey(id).getNum();
        boolean bool = false;
        //如果充值金额大于到账金币数目
        Money money = new Money().setId(id);
        if (gold != null && gold >= num) {
            money.setGold(gold);
            bool = true;
        }
        //赠送的金额判断
        if (giveGold != null && giveGold <= num && giveGold >= 0) {
            money.setGiveGold(giveGold);
            bool = true;
        }

        if (!bool) {
            throw new RuntimeException("没有可以修改的项");
        }
        return moneyDao.updateByPrimaryKeySelective(money) > 0 ? ResultUtils.success() : ResultUtils.error("修改失败");
    }

    /**
     * 修改背景图片
     *
     * @param id         充值的唯一ID
     * @param background 背景图对象
     * @return 修改结果
     */
    public Result updateBackgroundService(String id, MultipartFile background) {
        checkIdResultUtils(id);
        //生成文件的名称
        String fileName = FileImageUtils.createFileNameUtils(background);
        //保存背景图片
        if (FileImageUtils.saveImageUtils(background, fileName, IMAGE_5)) {


            Money money = new Money().setBackground(fileName).setId(id);
            if (moneyDao.updateByPrimaryKeySelective(money) > 0) {
                return ResultUtils.success();
            } else {
                //插入是失败后，就删除上传好的文件
                FileImageUtils.deleteImageUtils(fileName, IMAGE_5);
                return ResultUtils.error("添加失败");
            }
        }
        return ResultUtils.error("背景图片更换失败");
    }

    /**
     * 修改充值类型的状态
     *
     * @param id     充值的唯一ID
     * @param status 状态信息
     * @return 修改结果
     */
    public Result updateStatusService(String id, boolean status) {
        Money money = new Money().setStatus(status).setId(id);
        return moneyDao.updateByPrimaryKeySelective(money) > 0 ? ResultUtils.success() : ResultUtils.error("修改状失败");
    }
}
